﻿
using FaissOperation.FaissIndex.Index;
using FaissOperation.FaissIndexFlat;
using FaissOperation.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace FaissOperation.FaissIndex
{
    /// <summary>
    /// Faiss的FlatIndex实现，用于存储和查询向量数据。
    /// </summary>
    public class FlatVectorCollection : BaseFaissCollection
    {

        public override IEnumerable<SearchResult> Search(float[] query, int topK)
        {
            // 维度不匹配，不会返回任何数据。
            if (query.Length != Dimension)
            {
                return [];
            }

            var q = NormalizeOnAddAndQuery
                ? FaissHelper.NormalizeForFaiss(query)
                : query;



            var (labels, distances) = faissIndex.Search(q, topK);
            var results = new List<SearchResult>(vectors.Count);

            var ids = vectors.Keys.ToArray();

            for (int i = 0; i < labels.Length; i++)
            {
                // 如果标签在向量集合中存在，则添加到结果中
                if (labels[i] >= 0 && labels[i] < ids.Length)
                {
                    results.Add(new SearchResult(ids[(int)labels[i]], distances[i]));
                }
            }

            return results.ToArray();
        }

        public override void CreateIndex()
        {
            faissIndex = new FlatIndex(Dimension, FaissHelper.ToFaissMetric(MetricTypeInUse));

        }
    }



}
